//
// Created by xinrong.qian on 2025/5/29.
//

#ifndef CV_CAL_CARDPARAMPICKPROCESSOR_H
#define CV_CAL_CARDPARAMPICKPROCESSOR_H


#include <opencv2/core/mat.hpp>
#include "tc_response_info.hpp"
#include "CTLineResult.h"

class CardParamPickProcessor {

public:
    CardParamPickProcessor() = default;

    // 请求返回函数
    TcResponseInfo GetTcResponseInfo(const cv::Mat &image,
                                     int x, int y, int width, int height);
private:

    /**
     * 调试标志
     */
//    bool debugFlag = true;
    bool debugFlag = false;

    TcResponseInfo SuccessResponseInfo(const std::string &successMsg, const std::string &tcResult,
                                       const std::vector<double> &grayValues, int pc, int pt,
                                       double cValue, double tValue, double tcRatio);

    TcResponseInfo ErrorResponseInfo(const std::string &errorMsg);

    /**
     * TC阴阳性
     *
     * @param tcRatio  TC比值
     * @return
     */
    std::string calculateTcResult(double tcRatio);

    /**
     * 矫正图像，并裁剪黑边
     * @param input
     * @return
     */
    cv::Mat correctAndCropWhiteRectangle(const cv::Mat &input);

    /**
     * 绘制无旋转矩形
     * @param image 输入图片
     * @param center 矩形中心点坐标 (x,y)
     * @param width 矩形宽度
     * @param height 矩形高度
    */
    void visualizeRect(cv::Mat& image,
                       const cv::Point2f &center,
                       cv::Scalar_<double> color,
                       double width,
                       double height);

    /**
     * 绘制曲线
     *
     * @param data
     * @param name
     */
    void drawCurve(const std::vector<double>& data, std::string &name);

    /**
     * 预处理图像
     *
     * @param src
     * @return
     */
    cv::Mat preprocessImage(const cv::Mat& src);

    /**
     * 寻找 c t 线以及中点位置
     *
     * @param grayValues
     * @return
     */
    std::tuple<int, int, int>FindPeakPoints(const std::vector<double> &grayValues);

    /**
     * 截取数据
     *
     * @param data
     * @param start
     * @param end
     * @return
     */
    std::vector<double> crop(const std::vector<double> &data, int start, int end);

    /**
     * 寻找最小点
     *
     * @param average
     * @return
     */
    cv::Point2d minPoint2d(const std::vector<double> &average);


    /**
     *  计算给定数据向量 data 在指定区间内的定积分
     *
     * @param data
     * @param local
     * @param hwf
     * @return
     */
    double getDefiniteIntegral(const std::vector<double> &data, cv::Point2d local, int hwf = 4);

    /**
     * 声明扫描图像均值计算
     *
     * @param imgGray
     * @param R
     * @return
     */
    std::vector<double>meanRoundRectangle(const cv::Mat &imgGray, int R);

    /**
     * 计算CT函数
     *
     * @param image
     * @return
     */
    CTLineResult CalculateTc(const cv::Mat &image);

};


#endif //CV_CAL_CARDPARAMPICKPROCESSOR_H
